package com.wn.confirm;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author yellow Docter
 * @date 2023 -07-26
 * @desc
 *   测试 消息的手动应答机制
 *
 */
@Component
public class ConfirmConsumer {

    private Integer count = 0;

    @RabbitListener(
            bindings = @QueueBinding(
                    value = @Queue("confirm-queue"),
                    exchange =@Exchange(
                            name = "confirm-exchange",
                            type = ExchangeTypes.TOPIC
                    ),
                    key ="confirm.msg"
            )
    )
    public void handlerMsg(String msg, Channel channel, Message message) throws IOException {
        //消费消息
        //开启手动应答
        // 消费者手动确认消息消费; 参数1：消息id；参数2：是否批量确认
        try {
            int a = 10/0;
            System.out.println("ConfirmConsumer 消费消费了:====>" + msg);

            String messageId = message.getMessageProperties().getMessageId();
            //查询redis  有消息 消费 、把redis中的id 删除
            channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);

        } catch (Exception e) {

//            //到catch中
//            // 分析：消息消费失败了，希望把消息重投到队列中，再次进行消费，如果还是消费失败就拒绝消息
//            // 获取消息是否是重投的标记
            Boolean redelivered = message.getMessageProperties().getRedelivered();

            if (redelivered){ //重投消息
                //拒绝 消息
                // 重新投递的消息: 直接拒绝掉
                // 消息投递序号 是否将消息回退到队列
                channel.basicReject(
                        message.getMessageProperties().getDeliveryTag(),false);
                System.out.println("消息丢弃...." );

            }else{
                //把消息 重新 投递到 队列中
                // 该消息没有被重新投递过, 进行重投
                // 消息投递序号  是否批量  是否将消息回退到队列
                channel.basicNack(message.getMessageProperties().getDeliveryTag(),false,true);
                System.out.println("消息消费异常，消息进行重投");
            }
//            count ++;
//            if (count == 3){
//                channel.basicReject(
//                        message.getMessageProperties().getDeliveryTag(),false);
//                System.out.println("消息丢弃...." );
//            }else{
//                //把消息 回退到队列中
//                channel.basicNack(message.getMessageProperties().getDeliveryTag(),false,true);
//            }
        }

    }

}
